package com.sy.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 这个过滤器的作用是用于将每次客户端请求对应的请求对象和响应对象放入ThreadLocal对象中，
 * 使得在本次完整的请求过程中的任意一个地方都能从对应ThreadLocal对象中得到本次请求对应的请求对象
 * 和响应对象，由于在Web项目中，客户端发起的每一个请求相当于都是Tomcat中的一个线程，因此这些请求和
 * 响应对象在每次请求中也彼此独立的，通过这个过滤器可以解决Controller中就算不带参数，也可以使用
 * HttpServletRequest和HttpServletResponse的问题
 */
public class ServletApiHolder implements Filter {
    private static ThreadLocal<HttpServletRequest> curReq = new ThreadLocal<>();
    private static ThreadLocal<HttpServletResponse> curRes = new ThreadLocal<>();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;
        //保存当前的请求和响应对象
        curReq.set(req);
        curRes.set(res);
        filterChain.doFilter(req, res);
        //为了防止ThreadLocal中的内存泄露问题，当其中的对象不需要使用后，要清理掉
        curReq.remove();
        curRes.remove();
    }

    @Override
    public void destroy() {

    }

    public static HttpServletRequest getCurReq() {
        return curReq.get();
    }

    public static HttpServletResponse getCurRes() {
        return curRes.get();
    }
}
